<!DOCTYPE HTML>
<html>
<head>
<title>屏幕键盘 - 脚本示例 | AutoHotkey</title>
<meta name="description" content="The on-screen keyboard script creates a virtual keyboard at the bottom of your screen that shows the keys you are pressing in real time." />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>屏幕键盘(需要 XP/2k/NT) <span class="headnote">作者: Jon</span></h1>

<p>此脚本会在屏幕的底部创建一个模拟键盘来实时显示您按下的按键. 我写这个是为了帮我学习盲打(来适应不去看键盘). 在脚本的顶部可以自定义屏幕键盘的大小. 还有, 您可以双击托盘图标来显示或隐藏键盘.
</p>
<p><a href="KeyboardOnScreen.ahk">下载此脚本</a> &nbsp;| &nbsp;<a href="index.htm">其他示例脚本</a> &nbsp;| &nbsp;<a href="../AutoHotkey.htm">主页</a></p>

<pre class="NoIndent"><em>;---- Configuration Section: Customize the size of the on-screen keyboard and
; other options here.</em>

<em>; Changing this font size will make the entire on-screen keyboard get
; larger or smaller:</em>
k_FontSize = 10
k_FontName = Verdana  <em>; This can be blank to use the system's default font.</em>
k_FontStyle = Bold    <em>; Example of an alternative: Italic Underline</em>

<em>; Names for the tray menu items:</em>
k_MenuItemHide = Hide on-screen &amp;keyboard
k_MenuItemShow = Show on-screen &amp;keyboard

<em>; To have the keyboard appear on a monitor other than the primary, specify
; a number such as 2 for the following variable.  Leave it blank to use
; the primary:</em>
k_Monitor = 

<em>;---- End of configuration section.  Don't change anything below this point
; unless you want to alter the basic nature of the script.</em>


<em>;---- Alter the tray icon menu:</em>
Menu, Tray, Add, %k_MenuItemHide%, k_ShowHide
Menu, Tray, Add, &amp;Exit, k_MenuExit
Menu, Tray, Default, %k_MenuItemHide%
Menu, Tray, NoStandard

<em>;---- Calculate object dimensions based on chosen font size:</em>
k_KeyWidth = %k_FontSize%
k_KeyWidth *= 3
k_KeyHeight = %k_FontSize%
k_KeyHeight *= 3
k_KeyMargin = %k_FontSize%
k_KeyMargin /= 6
k_SpacebarWidth = %k_FontSize%
k_SpacebarWidth *= 25
k_KeyWidthHalf = %k_KeyWidth%
k_KeyWidthHalf /= 2

k_KeySize = w%k_KeyWidth% h%k_KeyHeight%
k_Position = x+%k_KeyMargin% %k_KeySize%

<em>;---- Create a GUI window for the on-screen keyboard:</em>
Gui, Font, s%k_FontSize% %k_FontStyle%, %k_FontName%
Gui, -Caption +E0x200 +ToolWindow
TransColor = F1ECED
Gui, Color, %TransColor%  <em>; This color will be made transparent later below.</em>

<em>;---- Add a button for each key. Position the first button with absolute
; coordinates so that all other buttons can be positioned relative to it:</em>
Gui, Add, Button, section %k_KeySize% xm+%k_KeyWidth%, 1
Gui, Add, Button, %k_Position%, 2
Gui, Add, Button, %k_Position%, 3
Gui, Add, Button, %k_Position%, 4
Gui, Add, Button, %k_Position%, 5
Gui, Add, Button, %k_Position%, 6
Gui, Add, Button, %k_Position%, 7
Gui, Add, Button, %k_Position%, 8
Gui, Add, Button, %k_Position%, 9
Gui, Add, Button, %k_Position%, 0
Gui, Add, Button, %k_Position%, -
Gui, Add, Button, %k_Position%, =
Gui, Add, Button, %k_Position%, Bk

Gui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Tab  <em>; Auto-width.</em>
Gui, Add, Button, %k_Position%, Q
Gui, Add, Button, %k_Position%, W
Gui, Add, Button, %k_Position%, E
Gui, Add, Button, %k_Position%, R
Gui, Add, Button, %k_Position%, T
Gui, Add, Button, %k_Position%, Y
Gui, Add, Button, %k_Position%, U
Gui, Add, Button, %k_Position%, I
Gui, Add, Button, %k_Position%, O
Gui, Add, Button, %k_Position%, P
Gui, Add, Button, %k_Position%, [
Gui, Add, Button, %k_Position%, ]
Gui, Add, Button, %k_Position%, \

Gui, Add, Button, xs+%k_KeyWidthHalf% y+%k_KeyMargin% %k_KeySize%, A
Gui, Add, Button, %k_Position%, S
Gui, Add, Button, %k_Position%, D
Gui, Add, Button, %k_Position%, F
Gui, Add, Button, %k_Position%, G
Gui, Add, Button, %k_Position%, H
Gui, Add, Button, %k_Position%, J
Gui, Add, Button, %k_Position%, K
Gui, Add, Button, %k_Position%, L
Gui, Add, Button, %k_Position%, `;
Gui, Add, Button, %k_Position%, '
Gui, Add, Button, x+%k_KeyMargin% h%k_KeyHeight%, Enter  <em>; Auto-width.</em>

<em>; The first button below adds %A_Space% at the end to widen it a little,
; making the layout of keys next to it more accurately reflect a real keyboard:</em>
Gui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Shift%A_Space%%A_Space%
Gui, Add, Button, %k_Position%, Z
Gui, Add, Button, %k_Position%, X
Gui, Add, Button, %k_Position%, C
Gui, Add, Button, %k_Position%, V
Gui, Add, Button, %k_Position%, B
Gui, Add, Button, %k_Position%, N
Gui, Add, Button, %k_Position%, M
Gui, Add, Button, %k_Position%, `,
Gui, Add, Button, %k_Position%, .
Gui, Add, Button, %k_Position%, /

Gui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Ctrl  <em>; Auto-width.</em>
Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin%, Win      <em>; Auto-width.</em>
Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin%, Alt      <em>; Auto-width.</em>
Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin% w%k_SpacebarWidth%, Space


<em>;---- Show the window:</em>
Gui, Show
k_IsVisible = y

WinGet, k_ID, ID, A   <em>; Get its window ID.</em>
WinGetPos,,, k_WindowWidth, k_WindowHeight, A

<em>;---- Position the keyboard at the bottom of the screen (taking into account
; the position of the taskbar):</em>
SysGet, k_WorkArea, MonitorWorkArea, %k_Monitor%

<em>; Calculate window's X-position:</em>
k_WindowX = %k_WorkAreaRight%
k_WindowX -= %k_WorkAreaLeft%  <em>; Now k_WindowX contains the width of this monitor.</em>
k_WindowX -= %k_WindowWidth%
k_WindowX /= 2  <em>; Calculate position to center it horizontally.
; The following is done in case the window will be on a non-primary monitor
; or if the taskbar is anchored on the left side of the screen:</em>
k_WindowX += %k_WorkAreaLeft%

<em>; Calculate window's Y-position:</em>
k_WindowY = %k_WorkAreaBottom%
k_WindowY -= %k_WindowHeight%

WinMove, A,, %k_WindowX%, %k_WindowY%
WinSet, AlwaysOnTop, On, ahk_id %k_ID%
WinSet, TransColor, %TransColor% 220, ahk_id %k_ID%


<em>;---- Set all keys as hotkeys. See www.asciitable.com</em>
k_n = 1
k_ASCII = 45

Loop
{
    Transform, k_char, Chr, %k_ASCII%
    StringUpper, k_char, k_char
    if k_char not in &lt;,&gt;,^,~,?,`,
        Hotkey, ~*%k_char%, k_KeyPress
        <em>; In the above, the asterisk prefix allows the key to be detected regardless</em>
        <em>; of whether the user is holding down modifier keys such as Control and Shift.</em>
    if k_ASCII = 93
        break
    k_ASCII++
}

return <em>; End of auto-execute section.</em>


<em>;---- When a key is pressed by the user, click the corresponding button on-screen:</em>

~*Backspace::
ControlClick, Bk, ahk_id %k_ID%, , LEFT, 1, D
KeyWait, Backspace
ControlClick, Bk, ahk_id %k_ID%, , LEFT, 1, U
return


<em>; LShift and RShift are used rather than "Shift" because when used as a hotkey,
; "Shift" would default to firing upon release of the key (in older AHK versions):</em>
~*LShift::
~*RShift::
~*LCtrl::  <em>; Must use Ctrl not Control to match button names.</em>
~*RCtrl::
~*LAlt::
~*RAlt::
~*LWin::
~*RWin::
StringTrimLeft, k_ThisHotkey, A_ThisHotkey, 3
ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, D
KeyWait, %k_ThisHotkey%
ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, U
return


~*,::
~*'::
~*Space::
~*Enter::
~*Tab::
k_KeyPress:
StringReplace, k_ThisHotkey, A_ThisHotkey, ~
StringReplace, k_ThisHotkey, k_ThisHotkey, *
SetTitleMatchMode, 3  <em>; Prevents the T and B keys from being confused with Tab and Backspace.</em>
ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, D
KeyWait, %k_ThisHotkey%
ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, U
Return


k_ShowHide:
if k_IsVisible = y
{
    Gui, Cancel
    Menu, Tray, Rename, %k_MenuItemHide%, %k_MenuItemShow%
    k_IsVisible = n
}
else
{
    Gui, Show
    Menu, Tray, Rename, %k_MenuItemShow%, %k_MenuItemHide%
    k_IsVisible = y
}
return


GuiClose:
k_MenuExit:
ExitApp
</pre>
</body>
</html>